為了可以盡量還原DJ用的Mixer,所以用了很多SeekBar來控制所有音量和左右聲道的參數
原本兩個音量的SeelBar想做成垂直的,但試了很多方法,想放在右邊的SeekBar都會跑到中間或左邊,所以就先用水平的了
MediaPlayer可以撥放音樂檔案
和在貓咪鋼琴用到的SoundPool不同,MediaPlayer一次只能載入一個檔案,但能撥放較長且較大的檔案,可以用在撥放BGM或是音樂撥放器
建立兩個MediaPlayer物件
lateinit var ch1 : MediaPlayer
lateinit var ch2 : MediaPlayer
在onCreate()
分別載入兩個不同的檔案
ch1 = MediaPlayer.create(this, R.raw.media1)
ch2 = MediaPlayer.create(this, R.raw.media2)
使用.start()
和.pause()
開始和暫停撥放
img_ch1.setOnClickListener {
if(ch1.isPlaying){
ch1.pause()
img_ch1.setImageResource(android.R.drawable.ic_media_play)
}else{
ch1.start()
img_ch1.setImageResource(android.R.drawable.ic_media_pause)
}
}
img_ch2.setOnClickListener {
if(ch2.isPlaying){
ch2.pause()
img_ch2.setImageResource(android.R.drawable.ic_media_play)
}else{
ch2.start()
img_ch2.setImageResource(android.R.drawable.ic_media_pause)
}
}
取得SeekBar的數值,使用.setVolume()
設置左右聲道的聲音
fun setVol_ch1(){
var m = vol_master.progress/100f*vol_ch1.progress/100f
var l = (100-balance_ch1.progress)/100f*(100-balance_master.progress)/100f
var r = balance_ch1.progress/100f*balance_master.progress/100f
if(crossFader.progress > 100){
m*= (200-crossFader.progress)/100f
}
ch1.setVolume(l*m,r*m)
}
fun setVol_ch2(){
var m = vol_master.progress/100f*vol_ch2.progress/100f
var l = (100-balance_ch2.progress)/100f*(100-balance_master.progress)/100f
var r = balance_ch2.progress/100f*balance_master.progress/100f
if(crossFader.progress < 100){
m*= (crossFader.progress)/100f
}
ch2.setVolume(l*m,r*m)
}
對每個SeekBar使用OnSeekBarChangeListener()
,在onProgressChanged()
設置音量
vol_master.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(p0: SeekBar, p1: Int, p2: Boolean) {
setVol_ch1()
setVol_ch2()
}
override fun onStartTrackingTouch(seekBar: SeekBar) {}
override fun onStopTrackingTouch(seekBar: SeekBar) {}
})